{
 "cells": [
  {
   "cell_type": "markdown",
   "source": [
    "1. Import libraries"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import yfinance as yf\n",
    "from sklearn.linear_model import Ridge, Lasso\n",
    "from sklearn.neighbors import KNeighborsRegressor\n",
    "from sklearn.model_selection import train_test_split"
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "2. Define functions to load data, create features"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "outputs": [],
   "source": [
    "def create_features(df):\n",
    "    df['Spread'] = df['High'] - df['Low']\n",
    "    df['Gap'] = df['Open'] - df['Close'].shift(1)\n",
    "    df['Intraday'] = df['Open'] - df['Close']\n",
    "    return df\n",
    "\n",
    "def drop_features(df):\n",
    "    df.drop(columns=['Spread',\n",
    "                     'Gap',\n",
    "                     'Intraday',\n",
    "                     ],\n",
    "            inplace=True)\n",
    "\n",
    "    df.drop(columns=['Open','High','Low','Close','Volume','Adj Close',\n",
    "                     ], inplace=True)\n",
    "    return df\n",
    "\n",
    "def process_features(df, lookback, step):\n",
    "    for i in range(step, lookback+1, step):\n",
    "        df['%d Spread' % (i)] = df['Spread'].pct_change(periods=i, fill_method=None)\n",
    "        df['%d Rolling Avg Spread' % (i)] = df['Spread'].rolling(window=i).mean()\n",
    "\n",
    "        df['%d Gap' % (i)] = df['Gap'].pct_change(periods=i, fill_method=None)\n",
    "        df['%d Rolling Avg Gap' % (i)] = df['Gap'].rolling(window=i).mean()\n",
    "\n",
    "        df['%d Intraday' % (i)] = df['Intraday'].pct_change(periods=i, fill_method=None)\n",
    "        df['%d Rolling Avg Intraday' % (i)] = df['Intraday'].rolling(window=i).mean()\n",
    "    return df\n",
    "\n",
    "def features(df, lookback, step):\n",
    "    create_features(df)\n",
    "    process_features(df, lookback, step)\n",
    "    drop_features(df)\n",
    "    return df"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "**What did we just do?**\n",
    "\n",
    "The spread feature measures volatility. The gap feature measures the price movement after hours, considering the stock market doesn't run 24/7. The intraday feature measures the price movement from the open to close.\n",
    "\n",
    "We will feed these features to the model to help it make a strategy."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "3. Create a function to create a target."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "outputs": [],
   "source": [
    "def create_target(df, lookforward=2, target='Open'):\n",
    "    df['Target'] = np.log(df[target].shift(periods=-lookforward)/df[target].shift(periods=-1))\n",
    "    return df"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "**Why create a seperate target instead of using the open or close price?**\n",
    "\n",
    "Because the price of the stock is always changing. For example, the model creates a rule to buy at 20 and sell at 30. What if the stock price goes above 30?\n",
    "\n",
    "**But the model can see all the data, so it will know what to do if it goes to a higher price.**\n",
    "\n",
    "What if the stock we are creating a strategy on reaches a new high, or a new low? Then the model won't know what to do. We need to scale the data in a way that doesn't make any assumptions. We will log normalize the open or close (you can pick) price and use that as our target."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "4. Define the models we are going to use\n",
    "\n",
    "We are going to use regularized linear models since they have a built in function that allows them to pick which features to keep or remove, and we are going to add a nearest neighbor model just to mix it up."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "outputs": [],
   "source": [
    "estimator1 = Ridge()\n",
    "estimator2 = Lasso(alpha=.001)\n",
    "estimator3 = KNeighborsRegressor()\n",
    "models = [estimator1,estimator2,estimator3]"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "5. Define the parameters and the dataframe where we will store our results\n",
    "\n",
    "Make sure that step is less than lookback. Our step is the interval of how many periods back we are going to creatures from, and lookback is how far back we will create features."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "outputs": [],
   "source": [
    "lookforward = 2\n",
    "step = 21\n",
    "lookback = 21\n",
    "\n",
    "results = pd.DataFrame()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "6. Import the data we are going to use, pick which stock we are going to use as a target, and create features from it. Then drop all NaNs and clean the data. Then split the data in half."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n"
     ]
    }
   ],
   "source": [
    "for model in models:\n",
    "    if lookback >= step:\n",
    "        spy = yf.download('SPY', start='2004-01-01')\n",
    "        agg = yf.download('AGG', start='2004-01-01')\n",
    "\n",
    "        spy = create_target(spy, lookforward, target='Open')\n",
    "\n",
    "        spy = features(spy, lookback, step)\n",
    "        spy = spy.add_suffix(' SPY')\n",
    "        agg = features(agg, lookback, step)\n",
    "        agg = agg.add_suffix(' AGG')\n",
    "        cv = pd.merge(spy, agg, how='inner', on='Date')\n",
    "\n",
    "        cv.drop(cv.tail(lookforward).index, inplace=True)\n",
    "        cv.drop(cv.head(lookback).index, inplace=True)\n",
    "        X = cv\n",
    "        y = X[['Target SPY']]\n",
    "        X = X.drop(columns=['Target SPY'])\n",
    "        X.fillna(method=\"ffill\", inplace=True)\n",
    "        X.replace([np.inf, -np.inf], 0, inplace=True)\n",
    "        X.fillna(0, inplace=True)\n",
    "\n",
    "        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.75, shuffle=False)\n",
    "\n",
    "        model.fit(X_train, y_train)\n",
    "        y_pred = model.predict(X_test)\n",
    "        results[model] = y_pred.flatten()\n",
    "\n",
    "    else:\n",
    "        print('Lookback must be greater than or equal to step')\n",
    "        break"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "**What did we do here?**\n",
    "\n",
    "When creating features for models, you want to have a lot of diverse features, one way we can do this is by creating features from different instruments. In this case, AGG is an ETF for bonds, while SPY is an ETF for stocks."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "7. Visualize the correlation of the models"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 2 Axes>",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAl0AAAHWCAYAAABNHTytAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAA9hAAAPYQGoP6dpAABmRklEQVR4nO3deVxN+f8H8NdtuRVRqTRUklCKlpE9jCxjGTsNxhIiu2FslaUUxjIMCmGsY1+/GGPfYyzZtaAoskV72ru/P/q54yozdad7zy2v5+NxH4/u53zuOe9z6fa+78/nfI5IIpFIQEREREQKpSZ0AERERERfAiZdRERERErApIuIiIhICZh0ERERESkBky4iIiIiJWDSRURERKQETLqIiIiIlIBJFxEREZESMOkiIiIiUgImXURERPTFy87OxnfffYerV69+tk9YWBj69u0LBwcH9O7dG/fv3y/RMZh0ERER0RctKysLkydPxqNHjz7b5/379xg5ciScnZ2xf/9+ODk5wdPTE+/fvy/2cZh0ERER0Rfr8ePHcHNzQ2xs7D/2O3r0KLS0tDBt2jRYWVnBx8cHFStWxLFjx4p9LCZdRERE9MW6du0amjRpgl27dv1jvzt37qBhw4YQiUQAAJFIhK+//hq3b98u9rE0/kugRERERKokOzsb2dnZMm1isRhisbjI/gMGDCjWfuPj41G7dm2ZNkNDw38ckvwUky5SSX9oWgsdAilYq5ClQodACpZQpfa/d6IyzaK24j6r5f07EL10HAIDA2Xaxo0bh/Hjx/+neDIyMgolbmKxuFCC90+YdBEREVG54enpiaFDh8q0fa7KVRJaWlqFEqzs7Gxoa2sXex9MuoiIiKjc+KehxP/CxMQEb9++lWl7+/YtqlatWux9cCI9ERER0b9wcHDArVu3IJFIAAASiQQ3b96Eg4NDsffBpIuIiIhUjkhTJNejNMXHxyMzMxMA0LFjR6SkpGDevHl4/Pgx5s2bh4yMDHTq1KnY+2PSRURERFQEFxcXHD16FACgq6uL4OBghIaGolevXrhz5w7Wrl2LChUqFHt/nNNFREREKkdNo3SrVsURGRn5j8/t7e1x4MABuffPShcRERGRErDSRURERCpHpFn+6kLl74yIiIiIVBCTLiIiIiIl4PAiERERqRwhJtIrGitdRERERErAShcRERGpnNJe6FQV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0kVERESkBEy6iIiIiJSAw4tERESkciRKuPeispW/MyIiIiJSQUy6iIiIiJSAw4tERESkenj1IhERERHJg5UuIiIiUjmcSE9EREREcmGli4iIiFSOBJzTRURERERyYKWLiIiIVA7ndBERERGRXJh0ERERESkBhxeJiIhI9XBxVCIiIiKSBytdREREpHIk5bAuVP7OiIiIiEgFsdJFREREKkfCOV1EREREJA9WuoiIiEjlcHFUIiIiIpILky4iIiIiJeDwIhEREakcCTiRnoiIiIjkwEoXERERqRxOpCciIiIiubDSRURERCqHi6MSERERkVxY6SIiIiKVw6sXiYiIiEguTLqIiIiIlIDDi0RERKRyuGQEEREREcmFlS4iIiJSOZxIT0RERERyYaWLiIiIVA7ndBERERGRXEQSiUQidBBERERE5R0rXURERERKwKSLiIiISAmYdBEREREpAZMuIiIiIiVg0kVERESkBEy6iIiIiJSASRcRERGREjDpIiIiIlICJl1ERERESsCki4iIiEgJmHQRERERKYGG0AEQEZVXDx8+RFhYGN69ewc1NTUYGRnB1tYWVlZWQodGpSgtLQ3h4eEy/87W1taoWLGi0KGRimHSRSSgFy9eyHxQm5iYCB0S/UfJycnYtm0bdu3ahbdv38LMzAwGBgbIz89HYmIi4uLi8NVXX8HNzQ39+/eHnp6e0CGTHHJzc3H06FFs374d9+7dg7q6OipXrgyJRILk5GQAgJOTE9zc3NC5c2eoq6sLHDGpApFEIpEIHQTRlyQ0NBQ7duzApUuXkJSUJG0XiUQwNDREy5Yt0bdvX3z99dfCBUly2bNnD4KDg9GyZUu0adMGTZs2hVgslumTnp6OW7du4Y8//sCVK1cwevRofP/99wJFTPK4fPky5s2bB1NTU7Rp0wYtWrSAubk5RCIRAEAikSAqKgqhoaH4448/8OrVK8yZMwctWrQQOHISGpMuIiWJioqCr68vEhISpB/UVlZW0NfXh0QiQWJiIiIjIxEaGoqjR4/CxMQEfn5+qF27ttChUzEtW7YMHh4eqFSpUrH6JyYmYuPGjZg8ebKCI6PSNHXqVIwfPx41atQoVv+oqCisWrUKv/zyi4IjI1XHpItISQYPHoyxY8eiSZMmxep/6dIlBAcHY+vWrQqOjIiIlIFJFxERUQksX74cw4cPh66u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\n"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "correlation = results.corr()\n",
    "sns.heatmap(correlation, annot=True, cmap='coolwarm', center=0)\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Here we see the models are mostly uncorrelated, which is good. Why do we want uncorrelated models (correlations as close to 0 as possible)? Because when we have uncorrelated models, each model has its own strategy to maximize the scoring function, and when we combine all these uncorrelated strategies, we get a meta-strategy or meta-model which has a robust strategy."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "In the next notebook we will evaluate the performance of the meta-model vs different lookbacks and step intervals."
   ],
   "metadata": {
    "collapsed": false
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
